第七章 类

Huan Lee Lv5

关键点

  • 类的思想
  • 各种成员函数类型
  • 类的作用域

设计类的目的:数据抽象和封装

成员函数

  • 定义在类内部的函数是隐式的inline函数

  • 成员函数通过名为 this的隐式形参来访问调用这个函数的对象

  • 成员函数的参数列表之后可以跟一个const,表示该成员函数是常量成员函数,即调用该函数时的 this 是指向常量对象的常量指针(默认是指向非常量的常量指针)

    • 常量对象,以及常量对象的指针和引用,只能调用常量成员函数

类的作用域

类的构造函数

  • 当且仅当类没有声明任何构造函数时,编译器才会为类自动生成默认构造函数
  • =default显式地要求编译器声明默认构造函数
  • 形参列表之后可以通过冒号和构造函数初始值列表,来为新对象中的一些成员变量赋初值

Untitled

  • 在初始值列表中进行初始化和赋值初始化是不同的

Untitled

Untitled

  • 数据的初始化顺序,与类中这些成员的声明顺序有关,与列表中的顺序无关

    • 因此最好让初始值列表的成员顺序与类中的声明顺序一致,否则互相调用的成员初始化可能会出错
  • C++11新增委托构造函数,即使用其他构造函数执行自己的初始化过程,但是它的初始值列表只有一个入口,即类名本身

    • 会先执行被委托的构造函数体,再执行委托者的构造函数体

Untitled

  • 默认构造函数的使用情况

Untitled

访问控制与封装

Untitled

  • struct和class都能用来声明类,只是两者的默认权限不一样

    • 默认访问权限对出现在第一个权限声明符( private:or public: )之前的成员生效

    • struct默认public,class默认private

  • 可以在类内部声明友元,从而允许访问私有的成员或函数(友元只是声明了权限,类外部必须再次声明函数)

Untitled

类的其他特性

  • 定义一个类型成员

Untitled

  • 使用mutable关键字,可以使得const对象的该成员可以被修改

Untitled

  • 返回调用对象的引用:return *this;这样就可以连续调用成员函数了(有java那味儿了)

  • 注:非常量版本的成员函数对常量对象是不可用的;常量对象return *this的结果还是常量对象

  • 类的类型转换:类的构造函数(只有一个实参)隐式地定义了类型转换的方式。注:编译器只会执行一步类型转换

    • 可以使用explicit来阻止这种隐式转换
  • 字面值常量类:

Untitled

类的作用域

  • 一个类就是一个作用域
  • 名字匹配的顺序依旧是由内而外
  • 当发生目标变量被隐藏的情况时,可以用this访问对象的成员,用::表明作用域访问类外部(全局)的变量

类的静态成员

  • 静态成员,表明该成员直接与类相关,而不是和每个对象相关,关键词为static

    • 类的静态成员数据存在于任何对象之外,只是表示数据的从属关系

      • 但是仍然可以通过对象(包括指针和引用)来访问静态成员(只要该成员为public)
    • 静态成员函数也不与任何对象绑定,因此函数内不可使用this指针,也不能被声明为const

  • 可以直接通过类名(作用域)来访问静态成员

  • 静态成员可以作为函数的默认实参

  • 静态成员可以是不完全类型(还未完全定义的类),如在一个类内声明自己

  • Title: 第七章 类
  • Author: Huan Lee
  • Created at : 2023-08-20 13:07:37
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/20/notion-第七章 类-1facc976/
  • License: This work is licensed under CC BY-NC-SA 4.0.